﻿using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.Options;
using Volo.Abp.Application.Services;

namespace FlyingEye.SignalRServices
{
    /// <summary>
    /// SignalR 客户端管理
    /// </summary>
    public class SignalRClientManager : ApplicationService
    {
        private readonly SignalRClientOptions _clientConfiguration;

        public SignalRClientManager(
            IOptions<SignalRClientOptions> options)
        {
            _clientConfiguration = options.Value;
        }

        private HubConnection _connection = null!;

        public async Task<HubConnection> CreateAsync()
        {
            _connection = new HubConnectionBuilder()
                // 设置服务端 URL，支持参数拼接（如订阅标识）
                // 示例：configuration.Url = "https://api.com/hub?group=devices"[1,3](@ref)
                .WithUrl(_clientConfiguration.Url)
                // 设置服务端响应超时时间（默认30秒）
                // 超过该时间未收到服务端响应将触发断开操作[3](@ref)
                .WithServerTimeout(TimeSpan.FromSeconds(_clientConfiguration.ServerTimeout))
                // 设置心跳检测间隔（默认15秒）
                // 客户端定期发送ping包检测连接活性[3](@ref)
                .WithKeepAliveInterval(TimeSpan.FromSeconds(_clientConfiguration.KeepAliveInterval))
                // 启用有状态重连（需要服务端支持）
                // 断线期间的消息会缓存在客户端，重连成功后自动补发[1](@ref)
                // 不启用状态连接
                //.WithStatefulReconnect()
                // 配置自动重连策略（默认尝试0、2、10、30秒间隔重连）
                // 可自定义重试策略（如示例中的随机间隔策略）[1,3](@ref)
                .WithAutomaticReconnect()
                // 完成配置并构建最终连接对象
                // 必须调用此方法生成可用的 HubConnection 实例[3](@ref)
                .Build();

            await _connection.StartAsync();

            return await Task.FromResult(_connection);
        }
    }
}
